﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using AlgorytmyGenetyczne;
using Funkcje;
using ZedGraph;

namespace Wykres2D
{
    public partial class KontrolkaWykresu2D : UserControl
    {
        public double KoniecDziedziny { get; set; }
        public double PoczatekDziedziny { get; set; }
        public double GestoscPunktowDziedziny { get; set; }
        public IFunkcja Funkcja { get; set; }
        public List<Point3D> ListaPunktow { get; set;}
        private LineItem krzywaFunkcji;
        private LineItem zbiorPunktow;
        private GraphPane panelWykresu;

        public KontrolkaWykresu2D()
        {
            InitializeComponent();
            GestoscPunktowDziedziny = 0.01;
            panelWykresu = new GraphPane(zedGraphControl.GraphPane.Rect, "Przebieg funkcji", "X1", "Y");
            zedGraphControl.GraphPane = panelWykresu;
            krzywaFunkcji = null;
            zbiorPunktow = null;
            ListaPunktow = new List<Point3D>();
            
        }

        public void narysujPunkty()
        {
            PointPairList listaPunktowDoNarysowania = konwertujPunktyDoWyswietlenia();
            if (zbiorPunktow == null)
            {
                zbiorPunktow = panelWykresu.AddCurve("", listaPunktowDoNarysowania, Color.Red, SymbolType.Circle);
                zbiorPunktow.Symbol.Fill = new Fill(Color.Blue);
                zbiorPunktow.Symbol.Size = zbiorPunktow.Symbol.Size/1.5f;
            }
            else
            {
                zbiorPunktow.Clear();
                zbiorPunktow.Points = listaPunktowDoNarysowania;
            }
            zbiorPunktow.Line.IsVisible = false;
        }

        public void narysujFunkcje()
        {
			//wyliczanie wspolrzednych dla podanej funkcji
            PointPairList listaPunktowKrzywej = przygotujWspolrzedneKrzywej();

			//Wygeneruj krzywa w czerownym kolorze bez etykiety i nie wyswietlaj punktow
            if(krzywaFunkcji == null)
            {
                krzywaFunkcji = panelWykresu.AddCurve("", listaPunktowKrzywej, Color.Green, SymbolType.None); 
            }else
            {
                krzywaFunkcji.Clear();
                krzywaFunkcji.Points = listaPunktowKrzywej;
            }
			
			//Wypelnienie dla tla wykresu
            panelWykresu.Chart.Fill = new Fill(Color.White);

			//Wypelnienie dla panelu wykresu
			panelWykresu.Fill = new Fill( Color.White);

			//Skalowanie osi wykresu
			zedGraphControl.AxisChange();
        }

        private PointPairList przygotujWspolrzedneKrzywej()
        {
            PointPairList listaPunktowKrzywej = new PointPairList();
            double krok = Math.Abs(PoczatekDziedziny - KoniecDziedziny) * GestoscPunktowDziedziny;
            var argument = new double[1];

            for (double x = PoczatekDziedziny; x < KoniecDziedziny+krok; x+= krok )
            {
                argument[0] = x;
                listaPunktowKrzywej.Add(x,Funkcja.wartosc(argument));
            }
            return listaPunktowKrzywej;
        }

        private PointPairList konwertujPunktyDoWyswietlenia()
        {
            PointPairList listaWynikowa = new PointPairList();
            foreach (Point3D punkt in ListaPunktow)
            {
                listaWynikowa.Add(punkt.x, punkt.z);
            }
            return listaWynikowa;
        }
        

    }
}
